/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import Entidades.Biometria;
import Entidades.Distrito;
import Entidades.Empleado;
import Entidades.EmpleadoJornada;
import Entidades.JornadaLaboral;
import Entidades.Oficina;
import Excepciones.NonexistentEntityException;
import Expertos.ExpertoEmpleado;
import Pantallas.Captura;
import Pantallas.Login;
import Pantallas.Logout;
import com.griaule.grfingerjava.FingerprintImage;
import com.griaule.grfingerjava.GrFingerJava;
import com.griaule.grfingerjava.GrFingerJavaException;
import com.griaule.grfingerjava.IFingerEventListener;
import com.griaule.grfingerjava.IImageEventListener;
import com.griaule.grfingerjava.IStatusEventListener;
import com.griaule.grfingerjava.MatchingContext;
import com.griaule.grfingerjava.Template;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author diego
 */
public class ControladorEmpleado implements IStatusEventListener, IImageEventListener, IFingerEventListener {

    /**
     * Contexto utilizado para la capturaGuardar, extracción y coincidencia de
     * huellas digitales
     */
    private MatchingContext fingerprintSDK;
    /**
     * Interfaz de usuario donde se muestra la imagen de la huella
     */
    private Captura ui;
    private Login ui2;
    private Logout ui3;
    /**
     * Indica si la plantilla debe ser extraída automáticamente
     */
    private boolean autoExtract = true;
    /**
     * Arreglo que contiene localmente los datos de las huellas capturadas
     */
    private ByteArrayInputStream fingerprintData;
    /**
     * Arreglo que contiene la longitud del dato de la huella
     */
    private int fingerprintDataLength;
    /**
     * La imagen de la última huella digital capturada.
     */
    private FingerprintImage fingerprint;
    /**
     * La plantilla de la última imagen de huella capturada
     */
    private List<Biometria> bio;
    public boolean capturaGuardar = false;
    public boolean capturaLogin = false;
    public boolean capturaLogout = false;
    private boolean coinciden = false;
    public boolean levanto = false;
    private int resultado = -1;
    public com.griaule.grfingerjava.Template template;
    ExpertoEmpleado expertoEmpleado = new ExpertoEmpleado();
    Empleado empleado;

    public ControladorEmpleado(Captura ui) {
        capturaGuardar = true;
        this.ui = ui;
    }

    public ControladorEmpleado(Login ui) {
        capturaLogin = true;
        this.ui2 = ui;
    }

    public ControladorEmpleado(Logout ui) {
        capturaLogout = true;
        this.ui3 = ui;
    }

    public ControladorEmpleado() {
    }

    public List<Empleado> inicializarPantallaEmpleado() {
        List<Empleado> todoslosempleados;
        todoslosempleados = expertoEmpleado.buscarEmpleadosValidos();
        return todoslosempleados;
    }

    public void modificarEmpleado(Empleado empleado, Calendar fechanac, String sexo, String nombre, String apellido, int anti, String estadocivil, String legajo, String cuil, String du, String email, String nacionalidad, JornadaLaboral idJornada, Oficina idOficina, String tipoDU, String telefono, Distrito idDistrito, String barrio, String calle, String nroCalle, String nroDpto, String piso) {
        expertoEmpleado.modificarEmpleado(empleado, fechanac, sexo, nombre, apellido, anti, estadocivil, legajo, cuil, du, email, nacionalidad, idJornada, idOficina, tipoDU, telefono, idDistrito, barrio, calle, nroCalle, nroDpto, piso);
    }

    public Empleado nuevoEmpleado(String nombre, String apellido, int anti, String estadocivil, String legajo, String cuil, String du, String email, String nacionalidad, Oficina idOficina, String tipoDU, String telefono, Distrito idDistrito, String barrio, String calle, String nroCalle, String nroDpto, String piso, Calendar fechanac, String sexo, Date fechaBaja) {
        return expertoEmpleado.nuevoEmpleado(nombre, apellido, anti, estadocivil, legajo, cuil, du, email, nacionalidad, idOficina, tipoDU, telefono, idDistrito, barrio, calle, nroCalle, nroDpto, piso, fechanac, sexo, fechaBaja);
    }

    public void asignarJL(Empleado empleado, EmpleadoJornada ejl2, JornadaLaboral jle) {
        expertoEmpleado.asignarJL(empleado, ejl2, jle);
    }

    public void inicializarCaptura() {
        try {
            fingerprintSDK = new MatchingContext();
            //Inicializa la capturaGuardar de huella digital.
            GrFingerJava.initializeCapture(this);
        } catch (Exception e) {
            //Si ocurre un error durante la inicialización se indica con un mensaje y se cierra la aplicación.
            System.out.println("Error al iniciar la captura:  " + e.getMessage());
            e.printStackTrace();
        }
    }

    public void finalizarCaptura() {
        try {
            GrFingerJava.finalizeCapture();
        } catch (GrFingerJavaException ex) {
            System.out.println("Error al finalizar la captura:  " + ex.getMessage());
        }
    }

    public static void setFingerprintSDKNativeDirectory(String directorio) {
        File directory = new File(directorio);
        try {
            GrFingerJava.setNativeLibrariesDirectory(directory);
            GrFingerJava.setLicenseDirectory(directory);
        } catch (GrFingerJavaException e) {
        }
    }

    @Override
    public void onSensorPlug(String idSensor) {
        try {
            //Comienza la capturaGuardar con el lector conectado.
            GrFingerJava.startCapture(idSensor, this, this);
            System.out.println("Escaner conectado");
        } catch (GrFingerJavaException e) {
        }
    }

    @Override
    public void onSensorUnplug(String idSensor) {
        try {
            GrFingerJava.stopCapture(idSensor);
            System.out.println("Escaner desenchufado");
        } catch (GrFingerJavaException e) {
        }
    }

    @Override
    public void onImageAcquired(String idSensor, FingerprintImage huellaDigital) {
        //Almacena la imagen de la huella
        this.fingerprint = huellaDigital;
        if (capturaGuardar) {
            //Muestra la imagen obtenida
            ui.showImage(huellaDigital);
        }
        if (capturaLogin) {
            ui2.showImage(huellaDigital);
        }
        if (capturaLogout) {
            ui3.showImage(huellaDigital);
        }
        //Muestra la plantilla en la imagen actual
        extract();
    }

    /**
     * Extract a fingerprint template from current image.
     */
    public void extract() {

        try {
            //Extracts a template from the current fingerprint image. 
            template = fingerprintSDK.extract(fingerprint);
            if (capturaGuardar) {
                //display minutiae/segments/directions into image
                ui.showImage(GrFingerJava.getBiometricImage(template, fingerprint));
            }
            if (capturaLogin) {
                ui2.showImage(GrFingerJava.getBiometricImage(template, fingerprint));
            }
            if (capturaLogout) {
                ui3.showImage(GrFingerJava.getBiometricImage(template, fingerprint));
            }
        } catch (GrFingerJavaException e) {
            System.out.println("Error en el extract:  " + e.getMessage());
        }

    }

    /*
     * Guarda los datos de la huella digital actual en la base de datos  
     * */
    public void guardarHuella(Empleado emple) throws IOException {

        fingerprintData = new ByteArrayInputStream(template.getData());
        fingerprintDataLength = template.getData().length;
        Empleado identificarPersona = identificarPersona();
        expertoEmpleado.guardarHuella(emple, fingerprintData);

    }

    public Empleado identificarPersona() {
        //Obtiene todas las huellas de la bd
        //ResultSet rsIdentificar = identificarStmt.executeQuery();
        bio = expertoEmpleado.buscarTodasLasHuellas();
        //Si se encuentra el nombre en la base de datos
        for (Biometria biometria : bio) {
            byte templateBuffer[] = biometria.getHuellaUsada();
            //Crea una nueva plantilla
            Template referenceTemplate = new Template(templateBuffer);
            //compara las plantilas (actual vs bd)
            try {
                coinciden = fingerprintSDK.verify(template, referenceTemplate);
            } catch (GrFingerJavaException ex) {
                empleado = null;
            }

            if (coinciden) {
                empleado = biometria.getIdEmpleado();
                System.out.println("LAS HUELLAS COINCIDEN CON EL EMPLEADO: " + empleado.getApellido());
            }
        }

        return empleado;
    }

    @Override
    public void onFingerDown(String string) {
        System.out.println("Puso el dedo");
        levanto = false;
    }

    @Override
    public void onFingerUp(String string) {
        System.out.println("Saco el dedo");
        levanto = true;
    }

    public void actualizarHuella(Empleado emple) throws IOException, NonexistentEntityException {
        fingerprintData = new ByteArrayInputStream(template.getData());
        fingerprintDataLength = template.getData().length;
        Empleado identificado = identificarPersona();
        if (emple != identificado) {
            resultado = JOptionPane.showOptionDialog(null, "¿Desea reemplazar la huella? del empleado: '", "Captura Digital", 2, 1, null, null, null);
        }
        if (resultado == JOptionPane.OK_OPTION) {
            ///Si decide reemplazar la huella por la del otro empleado
            ///Actualizo la huella del empleado
            expertoEmpleado.actualizarHuella(emple, fingerprintData);
            ///Borro la huella del otro empleado
            expertoEmpleado.eliminarHuella(identificado.getBio());
            
        }
    }

    public List<Empleado> buscarEmpleadoLegajo(String legajo) {
        return expertoEmpleado.buscarEmpleadoLegajo(legajo);
    }

    public List<Empleado> buscarEmpleadoDU(String du) {
        return expertoEmpleado.buscarEmpleadoDU(du);
    }
        public void eliminarEmpleado(Empleado e1) throws NonexistentEntityException {
        expertoEmpleado.eliminarEmpleado(e1);
    }
        public Biometria buscarBio(Empleado ide) {
            return expertoEmpleado.buscarBio(ide);
        }
}
